/**
 * 190. 颠倒二进制位
 * https://leetcode-cn.com/problems/reverse-bits/
 */
public class Solutions_190 {
    public static void main(String[] args) {
        int num = 43261596;  // (0b00000010100101000001111010011100)
        // output: 964176192 (0b00111001011110000010100101000000)

//        int num = -3;  // (0b11111111111111111111111111111101)
        // output: -1073741825 (0b10111111111111111111111111111111)

        int result = reverseBits(num);
        System.out.println(result);
    }

    public static int reverseBits(int n) {
        int res = 0;
//        while (n != 0) {
        // 不用 while 循环，用 for 来循环取 32 个位
        for (int i = 0; i < 32; i++) {
            // 运算优先级，加括号
            res = (res << 1) + (n & 1);
            // 仅循环 32 次，故无符号右移和有符号右移都可以
            // 否则使用无符号右移时，高位是 1 时，填充的高位还是 1
            n = n >>> 1;
        }
        return res;
    }
}
